// 《围棋》作者版权所有。保留所有权利。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// 包轮询支持对带有轮询的文件描述符进行非阻塞I/O。
// 这支持只阻止goroutine而不是线程的I/O操作。
// 这是网络和操作系统软件包使用的。
// 它使用运行时内置的轮询器，并得到
// 运行时调度器的支持。
package poll

import (
	"errors"
)

// errNetClosing是变量errNetClosing的类型。
// 这是用来实现网络的。错误接口。
type errNetClosing struct{}

// Error返回ErrNetClosing的错误消息。
// 由于问题#4373:
// 由于历史上程序一直无法检测到
// 此错误，他们会查找字符串。
func (e errNetClosing) Error() string { return "use of closed network connection" }

func (e errNetClosing) Timeout() bool   { return false }
func (e errNetClosing) Temporary() bool { return false }

// 在
// 关闭后使用网络描述符时返回ErrNetClosing。
var ErrNetClosing = errNetClosing{}

// ErrFileClosing在文件描述符关闭后使用时返回。
var ErrFileClosing = errors.New("use of closed file")

// ErrNoDeadline在不使用轮询器的文件类型上请求设置截止日期时返回。
var ErrNoDeadline = errors.New("file type does not support deadline")

// 根据isFile返回相应的关闭错误。
func errClosing(isFile bool) error {
	if isFile {
		return ErrFileClosing
	}
	return ErrNetClosing
}

// errdeadlineexcelled返回过期的截止日期。
// 这是由操作系统包作为操作系统导出的。超过了死亡线。
var ErrDeadlineExceeded error = &DeadlineExceededError{}

// DeadlineExceeDerror在截止日期到期时返回。
type DeadlineExceededError struct{}

// 实现网络。错误接口。
// 字符串是“i/o超时”，因为这是早期Go版本返回的结果。更改它可能会中断
// 在错误字符串上匹配的程序。
func (e *DeadlineExceededError) Error() string   { return "i/o timeout" }
func (e *DeadlineExceededError) Timeout() bool   { return true }
func (e *DeadlineExceededError) Temporary() bool { return true }

// 当文件或套接字不适合用于事件通知时，返回errnotpolable。
var ErrNotPollable = errors.New("not pollable")

// consume从字节片中删除数据，例如writev。
func consume(v *[][]byte, n int64) {
	for len(*v) > 0 {
		ln0 := int64(len((*v)[0]))
		if ln0 > n {
			(*v)[0] = (*v)[0][n:]
			return
		}
		n -= ln0
		*v = (*v)[1:]
	}
}

// TestHookDidWritev是测试writev的钩子。
var TestHookDidWritev = func(wrote int) {}
